package com.x.agent;

import com.x.prompt.PromptCreator;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.Map;
import lombok.Data;
import org.springframework.ai.chat.messages.Message;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * 这是一个基础的AI Agent执行类，允许执行多步的AI任务
 *
 * Agent应该是有限的执行步骤，并且遵循以下的规则
 * 1. 状态管理（未开始，正在处理，处理完成）
 * 2. 会话管理（能够跟踪对话）
 * 3. 步骤管理（能够跟踪执行步骤，以及进行步骤限制和监控）
 * 4. 线程安全
 * 5. 异常处理（能够检测并处理卡住的任务）
 *
 * @author xjk
 * @date 2025-06-19
 */
@Component
@Data
public abstract class BaseAgent {

  private String planId;

  private AgentExecutionStatusEnum status = AgentExecutionStatusEnum.UN_START;

  /** 最大执行步数 */
  private final Integer maxSteps = 20;

  /** 当前执行步数 */
  private Integer currentStep = 0;

  private Map<String, Object> envData = new HashMap<>();

  public abstract void clearPlan(String planId);

  public abstract String agentName();

  public abstract String agentDescription();

  @Autowired
  public PromptCreator promptCreator;

  /**
   * 获取当前Agent的思考信息
   * @return
   */
  public Message getThinkingMessage() {
    // 获取当前的操作系统信息
    String osName = System.getProperty("os.name");
    String osVersion = System.getProperty("os.version");
    String osArch = System.getProperty("os.arch");
    LocalDateTime nowDateTime = LocalDateTime.now();
    String currentDateTime = nowDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));

    String detailInfo = """
					1. 使用工具调用时，必须给出解释说明，说明使用这个工具的理由和背后的思考
					2. 简述过去的所有步骤已经都做了什么事
					""";


    Map<String, Object> variables = new HashMap<>();
    variables.put("osName", osName);
    variables.put("osVersion", osVersion);
    variables.put("osArch", osArch);
    variables.put("currentDateTime", currentDateTime);
    variables.put("detailOutput", detailInfo);

    String systemPromptTemp = """
        - SYSTEM INFORMATION:
        OS: {osName} {osVersion} ({osArch})
                
        - Current Date:
        {currentDateTime}
                
        重要说明：
        {detailOutput}
        3. 做且只做当前要做的步骤要求中的内容
        4. 如果当前要做的步骤要求已经做完，则调用terminate工具来完成当前步骤。
        5. 用户原始需求 是用来有个全局认识的，不要在当前步骤中去完成这个用户原始需求。
                
        """;

    return promptCreator.createSystemMessage(systemPromptTemp, variables);

  }

  public String run(){

    currentStep = 0;

    if (status != AgentExecutionStatusEnum.PROCESSING){
      throw new RuntimeException("Agent不处于处理状态，无法执行任务");
    }

    return null;
  }

}
